package sixth.对象转型;

class A {
    public void fun1() {
        System.out.println("父类  fun1()");
    }

    public void fun2() {
        System.out.println("父类  fun2()");
    }
}

class B extends A {
    public void fun1() {// 覆写父类fun1（）
        System.out.println("子类  fun1()");
    }

    public void fun3() {
        System.out.println("子类  fun3()");
    }
}

public class 向上转型 {
    public static void main(String[] args) {
        // 向上转型 子->父
        System.out.println("========= 向上转型 =========");
        B b = new B();
        A a = b;
        a.fun1();// 调用覆写的fun1（）
        a.fun2();// 调用父类的fun2（）
        // a.fun3();//无法访问 因为fun3()只在父类中定义 没有在子类中定义 如果想调用子类的方法肯定用子类实例

        // 解决fun3（）的问题
        System.out.println("========= 同时存在 =========");
        A a1 = new B();//向上转型   //相当于告诉父类自己有这个一个子类 父亲知道自己有这么一个孩子
        B b1 = (B)a1;//向下转型
       /* A a1 = new A();
        B b1 = (B)a1;*/
        b1.fun1();// 调用覆写的方法 B fun1
        b1.fun2();// 调用父类的方法
        b1.fun3();// 调用子类的方法
    }
}
/**
 * 对象向下转型的要求：
 * 在进行对象的向下转型之前，必须首先发生对象向上转型，否则将出现对象转换异常
 * 先上后下
 *
 */
